package com.xm.thread;

/**
 * 主线程等待子线程的终止
 * @author xiaoming
 * @date 2021-04-05 10:43
 * 在很多情况下，主线程创建并启动子线程，如果子线程中要进行大量的耗时运算，主线程将可能早于子线程结束。
 * 如果主线程需要知道子线程的执行结果时，就需要等待子线程执行结束了。
 * 主线程可以sleep(xx),但这样的xx时间不好确定，因为子线程的执行时间不确定，join()方法比较合适这个场景。
 *
 * 也就是说主线程的代码块中，如果碰到了t.join()方法，此时主线程需要等待（阻塞），
 * 等待子线程结束了(Waits for this thread to die.),才能继续执行t.join()之后的代码块。
 */
public class Join {

    public static void main(String[] args) {
        final Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t1 is runing");
            }
        });

        final Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {

                    // t1 调用 join(), t2 等待 t1 完成后开始执行
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    System.out.println("t2 is runing");
                }
            }
        });

        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    t2.join();
                    /*while (t2.isAlive()) {
                        wait();
                    }*/
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    System.out.println("t3 is runing");
                }
            }
        });

        t1.start();
        t2.start();
        t3.start();

    }

}
